/*
 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file native_huks_type.h
 *
 * @brief 提供huks中的枚举变量、结构体定义与宏定义。
 *
 * @since 8
 * @version 1.0
 */

#ifndef _NATIVE_HUKS_TYPE_H_
#define _NATIVE_HUKS_TYPE_H_

#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef OH_HUKS_API_PUBLIC
    #if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__ICCARM__) /* __ICCARM__ for iar */
        #define OH_HUKS_API_EXPORT
    #else
        #define OH_HUKS_API_EXPORT __attribute__ ((visibility("default")))
    #endif
#else
    #define OH_HUKS_API_EXPORT __attribute__ ((visibility("default")))
#endif

#define OH_HUKS_SDK_VERSION "2.0.0.4"


/**
 * @brief Align to 4-tuple。
 *
 * Before calling this function, ensure that the size does not overflow after 3 is added.
 *
 * @since 8
 * @version 1.0
 */
#define OH_HUKS_DEFAULT_ALIGN_MASK_SIZE 3

#define OH_HUKS_AE_TAG_LEN 16
#define OH_HUKS_BITS_PER_BYTE 8
#define OH_HUKS_MAX_KEY_SIZE 2048
#define OH_HUKS_AE_TAG_LEN 16
#define OH_HUKS_AE_NONCE_LEN 12
#define OH_HUKS_MAX_KEY_ALIAS_LEN 64
#define OH_HUKS_MAX_PROCESS_NAME_LEN 50
#define OH_HUKS_MAX_RANDOM_LEN 1024
#define OH_HUKS_SIGNATURE_MIN_SIZE 64
#define OH_HUKS_MAX_OUT_BLOB_SIZE (5 * 1024 * 1024)
#define OH_HUKS_WRAPPED_FORMAT_MAX_SIZE (1024 * 1024)
#define OH_HUKS_IMPORT_WRAPPED_KEY_TOTAL_BLOBS 10

/**
 * @brief 枚举密钥用途。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeyPurpose {
    /** 加密, 支持的密钥类型有RSA、EC、AES和SM4。 */
    OH_HUKS_KEY_PURPOSE_ENCRYPT = 1,
    /** 解密, 支持的密钥类型有RSA、EC、AES和SM4。 */
    OH_HUKS_KEY_PURPOSE_DECRYPT = 2,
    /** 签名, 支持的密钥类型有RSA和EC。 */
    OH_HUKS_KEY_PURPOSE_SIGN = 4,
    /** 验签, 支持的密钥类型有RSA和EC。 */
    OH_HUKS_KEY_PURPOSE_VERIFY = 8,
    /** 派生, 支持的密钥类型有EC。 */
    OH_HUKS_KEY_PURPOSE_DERIVE = 16,
    /** 包装, 支持的密钥类型有wrap。 */
    OH_HUKS_KEY_PURPOSE_WRAP = 32,
    /** 解包, 支持的密钥类型有unwrap。 */
    OH_HUKS_KEY_PURPOSE_UNWRAP = 64,
    /** 消息认证码。 */
    OH_HUKS_KEY_PURPOSE_MAC = 128,
    /** 协商。 */
    OH_HUKS_KEY_PURPOSE_AGREE = 256,
};

/**
 * @brief 枚举摘要算法类型。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeyDigest {
    /** 不使用摘要。 */
    OH_HUKS_DIGEST_NONE = 0,
    /** 信息摘要MD5。 */
    OH_HUKS_DIGEST_MD5 = 1,
    /** 国密摘要SM3。 */
    OH_HUKS_DIGEST_SM3 = 2,
    /** 安全哈希SHA1。 */
    OH_HUKS_DIGEST_SHA1 = 10,
    /** 安全哈希SHA224。 */
    OH_HUKS_DIGEST_SHA224 = 11,
    /** 安全哈希SHA256。 */
    OH_HUKS_DIGEST_SHA256 = 12,
    /** 安全哈希SHA384。 */
    OH_HUKS_DIGEST_SHA384 = 13,
    /** 安全哈希SHA512。 */
    OH_HUKS_DIGEST_SHA512 = 14,
};

/**
 * @brief 枚举数据填充方式。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeyPadding {
    /** 不填充。 */
    OH_HUKS_PADDING_NONE = 0,
    /** 最优非对称加密填充。 */
    OH_HUKS_PADDING_OAEP = 1,
    /** 概率签名方案填充。 */
    OH_HUKS_PADDING_PSS = 2,
    /** 公钥加密标准PKCS1_V1_5填充。 */
    OH_HUKS_PADDING_PKCS1_V1_5 = 3,
    /** 公钥加密标准PKCS5填充。 */
    OH_HUKS_PADDING_PKCS5 = 4,
    /** 公钥加密标准PKCS7填充。 */
    OH_HUKS_PADDING_PKCS7 = 5,
};

/**
 * @brief 枚举加密工作模式。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_CipherMode {
    /** 电子密码本模式。 */
    OH_HUKS_MODE_ECB = 1,
    /** 密文分组链接模式。 */
    OH_HUKS_MODE_CBC = 2,
    /** 计数器模式。 */
    OH_HUKS_MODE_CTR = 3,
    /** 输出反馈模。 */
    OH_HUKS_MODE_OFB = 4,
    /** 认证加密CCM模式。 */
    OH_HUKS_MODE_CCM = 31,
    /** 认证加密GCM模式。 */
    OH_HUKS_MODE_GCM = 32,
};

/**
 * @brief 枚举不同算法支持的密钥长度。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeySize {
    /** RSA算法支持的密钥长度为1024位。 */
    OH_HUKS_RSA_KEY_SIZE_1024 = 1024,
    /** RSA算法支持的密钥长度为2048位。 */
    OH_HUKS_RSA_KEY_SIZE_2048 = 2048,
    /** RSA算法支持的密钥长度为3072位。 */
    OH_HUKS_RSA_KEY_SIZE_3072 = 3072,
    /** RSA算法支持的密钥长度为4096位。 */
    OH_HUKS_RSA_KEY_SIZE_4096 = 4096,

    /** ECC算法支持的密钥长度为256位。 */
    OH_HUKS_ECC_KEY_SIZE_256 = 256,
    /** ECC算法支持的密钥长度为384位。 */
    OH_HUKS_ECC_KEY_SIZE_384 = 384,
    /** ECC算法支持的密钥长度为521位。 */
    OH_HUKS_ECC_KEY_SIZE_521 = 521,

    /** AES算法支持的密钥长度为128位。 */
    OH_HUKS_AES_KEY_SIZE_128 = 128,
    /** AES算法支持的密钥长度为192位。 */
    OH_HUKS_AES_KEY_SIZE_192 = 192,
    /** AES算法支持的密钥长度为256位。 */
    OH_HUKS_AES_KEY_SIZE_256 = 256,
    /** AES算法支持的密钥长度为512位。 */
    OH_HUKS_AES_KEY_SIZE_512 = 512,

    /** CURVE25519算法支持的密钥长度为256位。 */
    OH_HUKS_CURVE25519_KEY_SIZE_256 = 256,

    /** SM2算法支持的密钥长度为256位。 */
    OH_HUKS_SM2_KEY_SIZE_256 = 256,
    /** SM4算法支持的密钥长度为128位。 */
    OH_HUKS_SM4_KEY_SIZE_128 = 128,
};

/**
 * @brief 枚举支持的算法类型。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeyAlg {
    /** 非对称密钥算法RSA。 */
    OH_HUKS_ALG_RSA = 1,
    /** 非对称密钥算法ECC。 */
    OH_HUKS_ALG_ECC = 2,

    /** 对称密钥算法AES。 */
    OH_HUKS_ALG_AES = 20,
    /** 消息认证码算法HMAC。 */
    OH_HUKS_ALG_HMAC = 50,
    /** 基于HMAC的密钥推导函数算法HKDF。 */
    OH_HUKS_ALG_HKDF = 51,
    /** 伪随机函数以导出密钥算法PBKDF2。 */
    OH_HUKS_ALG_PBKDF2 = 52,

    /** 密钥协商算法ECDH。 */
    OH_HUKS_ALG_ECDH = 100,
    /** 密钥协商算法X25519。 */
    OH_HUKS_ALG_X25519 = 101,
    /** 签名验签算法ED25519。 */
    OH_HUKS_ALG_ED25519 = 102,

    /** 国密算法SM2。*/
    OH_HUKS_ALG_SM2 = 150,
    /** 国密算法SM3。*/
    OH_HUKS_ALG_SM3 = 151,
    /** 国密算法SM4。*/
    OH_HUKS_ALG_SM4 = 152,
};

/**
 * @brief 枚举解包套件的算法类型
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_AlgSuite {
    /** Algorithm suites of unwrapping wrapped-key by huks
     *  Unwrap suite of key agreement type
     */
    /** WrappedData format(Bytes Array):
     *  | x25519_plain_pubkey_length  (4 Byte) | x25519_plain_pubkey |  agreekey_aad_length (4 Byte) | agreekey_aad
     *  |   agreekey_nonce_length     (4 Byte) |   agreekey_nonce    | agreekey_aead_tag_len(4 Byte) | agreekey_aead_tag
     *  |    kek_enc_data_length      (4 Byte) |    kek_enc_data     |    kek_aad_length    (4 Byte) | kek_aad
     *  |      kek_nonce_length       (4 Byte) |      kek_nonce      |   kek_aead_tag_len   (4 Byte) | kek_aead_tag
     *  |   key_material_size_len     (4 Byte) |  key_material_size  |   key_mat_enc_length (4 Byte) | key_mat_enc_data
     */
    OH_HUKS_UNWRAP_SUITE_X25519_AES_256_GCM_NOPADDING = 1,

    /* WrappedData format(Bytes Array):
     *  |  ECC_plain_pubkey_length    (4 Byte) |  ECC_plain_pubkey   |  agreekey_aad_length (4 Byte) | agreekey_aad
     *  |   agreekey_nonce_length     (4 Byte) |   agreekey_nonce    | agreekey_aead_tag_len(4 Byte) | agreekey_aead_tag
     *  |    kek_enc_data_length      (4 Byte) |    kek_enc_data     |    kek_aad_length    (4 Byte) | kek_aad
     *  |      kek_nonce_length       (4 Byte) |      kek_nonce      |   kek_aead_tag_len   (4 Byte) | kek_aead_tag
     *  |   key_material_size_len     (4 Byte) |  key_material_size  |   key_mat_enc_length (4 Byte) | key_mat_enc_data
     */
    OH_HUKS_UNWRAP_SUITE_ECDH_AES_256_GCM_NOPADDING = 2,
};

/**
 * @brief 枚举生成的密钥类型。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeyGenerateType {
    /** 默认类型。  */
    OH_HUKS_KEY_GENERATE_TYPE_DEFAULT = 0,
    /** 派生类型。  */
    OH_HUKS_KEY_GENERATE_TYPE_DERIVE = 1,
    /** 协商类型。  */
    OH_HUKS_KEY_GENERATE_TYPE_AGREE = 2,
};

/**
 * @brief 枚举密钥的标记类型。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeyFlag {
    /** 导入密钥的标记。*/
    OH_HUKS_KEY_FLAG_IMPORT_KEY = 1,
    /** 生成密钥的标记。*/
    OH_HUKS_KEY_FLAG_GENERATE_KEY = 2,
    /** 协商密钥的标记。*/
    OH_HUKS_KEY_FLAG_AGREE_KEY = 3,
    /** 派生密钥的标记。*/
    OH_HUKS_KEY_FLAG_DERIVE_KEY = 4,
};

/**
 * @brief 枚举密钥的存储类型。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_KeyStorageType {
    /** 临时性存储。*/
    OH_HUKS_STORAGE_TEMP = 0,
    /** 永久性存储。*/
    OH_HUKS_STORAGE_PERSISTENT = 1,
};

/**
 * @brief 枚举导入密钥的类型。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_ImportKeyType {
    /** 公钥类型。 */
    OH_HUKS_KEY_TYPE_PUBLIC_KEY = 0,
    /** 私钥类型。 */
    OH_HUKS_KEY_TYPE_PRIVATE_KEY = 1,
    /** 密钥对类型。 */
    OH_HUKS_KEY_TYPE_KEY_PAIR = 2,
};

/**
 * @brief 枚举状态返回码。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_ErrorCode {
    /** 成功。 */
    OH_HUKS_SUCCESS = 0,
    /** 失败。 */
    OH_HUKS_FAILURE = -1,
    /** 不好的状态。 */
    OH_HUKS_ERROR_BAD_STATE = -2,
    /** 无效的参数。 */
    OH_HUKS_ERROR_INVALID_ARGUMENT = -3,
    /** 不支持。 */
    OH_HUKS_ERROR_NOT_SUPPORTED = -4,
    /** 没有权限。 */
    OH_HUKS_ERROR_NO_PERMISSION = -5,
    /** 数据大小不足。 */
    OH_HUKS_ERROR_INSUFFICIENT_DATA = -6,
    /** 缓存区过小。 */
    OH_HUKS_ERROR_BUFFER_TOO_SMALL = -7,
    /** 内存不足。 */
    OH_HUKS_ERROR_INSUFFICIENT_MEMORY = -8,
    /** 通信失败。 */
    OH_HUKS_ERROR_COMMUNICATION_FAILURE = -9,
    /** 存储区出错。 */
    OH_HUKS_ERROR_STORAGE_FAILURE = -10,
    /** 硬件出错。 */
    OH_HUKS_ERROR_HARDWARE_FAILURE = -11,
    /** 已存在。 */
    OH_HUKS_ERROR_ALREADY_EXISTS = -12,
    /** 不存在。 */
    OH_HUKS_ERROR_NOT_EXIST = -13,
    /** 空指针。 */
    OH_HUKS_ERROR_NULL_POINTER = -14,
    /** 获取到的文件大小失败。 */
    OH_HUKS_ERROR_FILE_SIZE_FAIL = -15,
    /** 读文件失败。 */
    OH_HUKS_ERROR_READ_FILE_FAIL = -16,
    /** 无效的公钥。 */
    OH_HUKS_ERROR_INVALID_PUBLIC_KEY = -17,
    /** 无效的私钥。 */
    OH_HUKS_ERROR_INVALID_PRIVATE_KEY = -18,
    /** 无效的密钥数据。 */
    OH_HUKS_ERROR_INVALID_KEY_INFO = -19,
    /** 哈希值不相同。 */
    OH_HUKS_ERROR_HASH_NOT_EQUAL = -20,
    /** 创建内存失败。 */
    OH_HUKS_ERROR_MALLOC_FAIL = -21,
    /** 写文件失败。 */
    OH_HUKS_ERROR_WRITE_FILE_FAIL = -22,
    /** 删除文件失败。 */
    OH_HUKS_ERROR_REMOVE_FILE_FAIL = -23,
    /** 打开文件失败。 */
    OH_HUKS_ERROR_OPEN_FILE_FAIL = -24,
    /** 关闭文件失败。 */
    OH_HUKS_ERROR_CLOSE_FILE_FAIL = -25,
    /** 创建目录失败。 */
    OH_HUKS_ERROR_MAKE_DIR_FAIL = -26,
    /** 无效的密钥文件。 */
    OH_HUKS_ERROR_INVALID_KEY_FILE = -27,
    /** 进程间通信失败。 */
    OH_HUKS_ERROR_IPC_MSG_FAIL = -28,
    /** 请求溢出。 */
    OH_HUKS_ERROR_REQUEST_OVERFLOWS = -29,
    /** 参数不存在。 */
    OH_HUKS_ERROR_PARAM_NOT_EXIST = -30,
    /** 引擎侧失败。 */
    OH_HUKS_ERROR_CRYPTO_ENGINE_ERROR = -31,
    /** 通信超时。 */
    OH_HUKS_ERROR_COMMUNICATION_TIMEOUT = -32,
    /** IPC初始化失败。 */
    OH_HUKS_ERROR_IPC_INIT_FAIL = -33,
    /** IPC DLOPEN失败。 */
    OH_HUKS_ERROR_IPC_DLOPEN_FAIL = -34,
    /** 溢出读数据报错。 */
    OH_HUKS_ERROR_EFUSE_READ_FAIL = -35,
    /** 新的root密钥材料已存在。 */
    OH_HUKS_ERROR_NEW_ROOT_KEY_MATERIAL_EXIST = -36,
    /** 更新root密钥材料失败。 */
    OH_HUKS_ERROR_UPDATE_ROOT_KEY_MATERIAL_FAIL = -37,
    /** 验证失败。 */
    OH_HUKS_ERROR_VERIFICATION_FAILED = -38,
    /** 会话数已达到极限。 */
    OH_HUKS_ERROR_SESSION_REACHED_LIMIT = -39,

    /** 获取算法参数失败。 */
    OH_HUKS_ERROR_CHECK_GET_ALG_FAIL = -100,
    /** 获取密钥大小失败。 */
    OH_HUKS_ERROR_CHECK_GET_KEY_SIZE_FAIL = -101,
    /** 获取填充方式失败。 */
    OH_HUKS_ERROR_CHECK_GET_PADDING_FAIL = -102,
    /** 获取用途失败。 */
    OH_HUKS_ERROR_CHECK_GET_PURPOSE_FAIL = -103,
    /** 获取摘要算法失败。 */
    OH_HUKS_ERROR_CHECK_GET_DIGEST_FAIL = -104,
    /** 获取工作模式失败。 */
    OH_HUKS_ERROR_CHECK_GET_MODE_FAIL = -105,
    /** 获取nonce值失败。 */
    OH_HUKS_ERROR_CHECK_GET_NONCE_FAIL = -106,
    /** 获取认证数据失败。 */
    OH_HUKS_ERROR_CHECK_GET_AAD_FAIL = -107,
    /** 获取IV值失败。 */
    OH_HUKS_ERROR_CHECK_GET_IV_FAIL = -108,
    /** 获取AE标签值失败。 */
    OH_HUKS_ERROR_CHECK_GET_AE_TAG_FAIL = -109,
    /** 获取盐值失败。 */
    OH_HUKS_ERROR_CHECK_GET_SALT_FAIL = -110,
    /** 获取迭代值失败。 */
    OH_HUKS_ERROR_CHECK_GET_ITERATION_FAIL = -111,
    /** 无效的算法。 */
    OH_HUKS_ERROR_INVALID_ALGORITHM = -112,
    /** 无效的密钥长度。 */
    OH_HUKS_ERROR_INVALID_KEY_SIZE = -113,
    /** 无效的填充方式。 */
    OH_HUKS_ERROR_INVALID_PADDING = -114,
    /** 无效的用途。 */
    OH_HUKS_ERROR_INVALID_PURPOSE = -115,
    /** 无效的工作模式。 */
    OH_HUKS_ERROR_INVALID_MODE = -116,
    /** 无效的摘要算法。 */
    OH_HUKS_ERROR_INVALID_DIGEST =  -117,
    /** 无效的签名数据大小。 */
    OH_HUKS_ERROR_INVALID_SIGNATURE_SIZE = -118,
    /** 无效的IV值。 */
    OH_HUKS_ERROR_INVALID_IV = -119,
    /** 无效的AAD数据。 */
    OH_HUKS_ERROR_INVALID_AAD = -120,
    /** 无效的NONCE值。 */
    OH_HUKS_ERROR_INVALID_NONCE = -121,
    /** 无效的AE标签值。 */
    OH_HUKS_ERROR_INVALID_AE_TAG = -122,
    /** 无效的盐值。 */
    OH_HUKS_ERROR_INVALID_SALT = -123,
    /** 无效的迭代值。 */
    OH_HUKS_ERROR_INVALID_ITERATION = -124,
    /** 无效的操作。 */
    OH_HUKS_ERROR_INVALID_OPERATION = -125,
    /** 无效的数据包装格式。 */
    OH_HUKS_ERROR_INVALID_WRAPPED_FORMAT = -126,
    /** 无效的密钥使用。 */
    OH_HUKS_ERROR_INVALID_USAGE_OF_KEY = -127,

    /** 内部出错。 */
    OH_HUKS_ERROR_INTERNAL_ERROR = -999,
    /** 未知出错。 */
    OH_HUKS_ERROR_UNKNOWN_ERROR = -1000,
};

/**
 * @brief 枚举标签类型。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_TagType {
    /** 无效类型。 */
    OH_HUKS_TAG_TYPE_INVALID = 0 << 28,
    /** int类型。 */
    OH_HUKS_TAG_TYPE_INT = 1 << 28,
    /** uint类型。 */
    OH_HUKS_TAG_TYPE_UINT = 2 << 28,
    /** ulong类型。 */
    OH_HUKS_TAG_TYPE_ULONG = 3 << 28,
    /** bool类型。 */
    OH_HUKS_TAG_TYPE_BOOL = 4 << 28,
    /** bytes类型。 */
    OH_HUKS_TAG_TYPE_BYTES = 5 << 28,
};

/**
 * @brief 枚举发送消息的方式
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_SendType {
    /** 异步。 */
    OH_HUKS_SEND_TYPE_ASYNC = 0,
    /** 同步。 */
    OH_HUKS_SEND_TYPE_SYNC,
};

/**
 * @brief 枚举标签值。
 *
 * @since 8
 * @version 1.0
 */
enum OH_Huks_Tag {
    /** 无效标签值。 */
    OH_HUKS_TAG_INVALID = OH_HUKS_TAG_TYPE_INVALID | 0,

    /** 基础算法中用到的标签值是从1到200。 */
    /** 算法类型。 */
    OH_HUKS_TAG_ALGORITHM = OH_HUKS_TAG_TYPE_UINT | 1,
    /** 用途。 */
    OH_HUKS_TAG_PURPOSE = OH_HUKS_TAG_TYPE_UINT | 2,
    /** 密钥长度 。 */
    OH_HUKS_TAG_KEY_SIZE = OH_HUKS_TAG_TYPE_UINT | 3,
    /** 摘要算法。 */
    OH_HUKS_TAG_DIGEST = OH_HUKS_TAG_TYPE_UINT | 4,
    /** 填充方式。 */
    OH_HUKS_TAG_PADDING = OH_HUKS_TAG_TYPE_UINT | 5,
    /** 工作模式。 */
    OH_HUKS_TAG_BLOCK_MODE = OH_HUKS_TAG_TYPE_UINT | 6,
    /** 密钥类型。 */
    OH_HUKS_TAG_KEY_TYPE = OH_HUKS_TAG_TYPE_UINT | 7,
    /** 认证数据。 */
    OH_HUKS_TAG_ASSOCIATED_DATA = OH_HUKS_TAG_TYPE_BYTES | 8,
    /** NONCE值。 */
    OH_HUKS_TAG_NONCE = OH_HUKS_TAG_TYPE_BYTES | 9,
    /** IV矢量。 */
    OH_HUKS_TAG_IV = OH_HUKS_TAG_TYPE_BYTES | 10,

    /** 用于密钥派生的标签值。 */
    /** 派生信息。 */
    OH_HUKS_TAG_INFO = OH_HUKS_TAG_TYPE_BYTES | 11,
    /** 派生盐值。 */
    OH_HUKS_TAG_SALT = OH_HUKS_TAG_TYPE_BYTES | 12,
    /** 派生密码。 */
    OH_HUKS_TAG_PWD = OH_HUKS_TAG_TYPE_BYTES | 13,
    /** 派生迭代数。 */
    OH_HUKS_TAG_ITERATION = OH_HUKS_TAG_TYPE_UINT | 14,

    /** 生成密钥的类型，类型可在枚举OH_Huks_KeyGenerateType中选择。 */
    OH_HUKS_TAG_KEY_GENERATE_TYPE = OH_HUKS_TAG_TYPE_UINT | 15,
    /** 派生main密钥。 */
    OH_HUKS_TAG_DERIVE_MAIN_KEY = OH_HUKS_TAG_TYPE_BYTES | 16,
    /** 派生因素。 */
    OH_HUKS_TAG_DERIVE_FACTOR = OH_HUKS_TAG_TYPE_BYTES | 17,
    /** 派生算法。 */
    OH_HUKS_TAG_DERIVE_ALG = OH_HUKS_TAG_TYPE_UINT | 18,
    /** 协商算法。 */
    OH_HUKS_TAG_AGREE_ALG = OH_HUKS_TAG_TYPE_UINT | 19,
    /** 是否带有用于协商的公钥。 */
    OH_HUKS_TAG_AGREE_PUBLIC_KEY_IS_KEY_ALIAS = OH_HUKS_TAG_TYPE_BOOL | 20,
    /** 用于协商的私钥别名。 */
    OH_HUKS_TAG_AGREE_PRIVATE_KEY_ALIAS = OH_HUKS_TAG_TYPE_BYTES | 21,
    /** 用于协商的公钥。 */
    OH_HUKS_TAG_AGREE_PUBLIC_KEY = OH_HUKS_TAG_TYPE_BYTES | 22,
    /** 密钥别名。 */
    OH_HUKS_TAG_KEY_ALIAS = OH_HUKS_TAG_TYPE_BYTES | 23,
    /** 派生密钥大小。 */
    OH_HUKS_TAG_DERIVE_KEY_SIZE = OH_HUKS_TAG_TYPE_UINT | 24,
    /** 导入密钥类型, 类型可在枚举OH_Huks_ImportKeyType中选择。 */
    OH_HUKS_TAG_IMPORT_KEY_TYPE = OH_HUKS_TAG_TYPE_UINT | 25,
    /** 解包套件算法。 */
    OH_HUKS_TAG_UNWRAP_ALGORITHM_SUITE = OH_HUKS_TAG_TYPE_UINT | 26,

    /**
     * Key authentication related TAG: 201 - 300
     *
     * Start of validity
     */
    /** 密钥认证需要用到的标签值从201到300。 */
    /** 活跃时间。 */
    OH_HUKS_TAG_ACTIVE_DATETIME = OH_HUKS_TAG_TYPE_ULONG | 201,

    /** Date when new "messages" should not be created. */
    /** 发放过期日期。 */
    OH_HUKS_TAG_ORIGINATION_EXPIRE_DATETIME = OH_HUKS_TAG_TYPE_ULONG | 202,

    /** Date when existing "messages" should not be used. */
    /** 使用过期日期。 */
    OH_HUKS_TAG_USAGE_EXPIRE_DATETIME = OH_HUKS_TAG_TYPE_ULONG | 203,

    /** 密钥创建的时间。 */
    OH_HUKS_TAG_CREATION_DATETIME = OH_HUKS_TAG_TYPE_ULONG | 204,

    /** Other authentication related TAG: 301 - 500 */
    /** 所有使用者。 */
    OH_HUKS_TAG_ALL_USERS = OH_HUKS_TAG_TYPE_BOOL | 301,
    /** 用户ID。 */
    OH_HUKS_TAG_USER_ID = OH_HUKS_TAG_TYPE_UINT | 302,
    /** 无认证请求。 */
    OH_HUKS_TAG_NO_AUTH_REQUIRED = OH_HUKS_TAG_TYPE_BOOL | 303,
    /** 用户认证类型。 */
    OH_HUKS_TAG_USER_AUTH_TYPE = OH_HUKS_TAG_TYPE_UINT | 304,
    /** 认证超时。 */
    OH_HUKS_TAG_AUTH_TIMEOUT = OH_HUKS_TAG_TYPE_UINT | 305,
    /** 认证token。 */
    OH_HUKS_TAG_AUTH_TOKEN = OH_HUKS_TAG_TYPE_BYTES | 306,

    /** Attestation related TAG: 501 - 600 */
    /** 挑战值。 */
    OH_HUKS_TAG_ATTESTATION_CHALLENGE = OH_HUKS_TAG_TYPE_BYTES | 501,
    /** 应用ID。 */
    OH_HUKS_TAG_ATTESTATION_APPLICATION_ID = OH_HUKS_TAG_TYPE_BYTES | 502,
    /** 商标名。 */
    OH_HUKS_TAG_ATTESTATION_ID_BRAND = OH_HUKS_TAG_TYPE_BYTES | 503,
    /** 设备名。 */
    OH_HUKS_TAG_ATTESTATION_ID_DEVICE = OH_HUKS_TAG_TYPE_BYTES | 504,
    /** 产品名。 */
    OH_HUKS_TAG_ATTESTATION_ID_PRODUCT = OH_HUKS_TAG_TYPE_BYTES | 505,
    /** 序号。 */
    OH_HUKS_TAG_ATTESTATION_ID_SERIAL = OH_HUKS_TAG_TYPE_BYTES | 506,
    /** IMEI。 */
    OH_HUKS_TAG_ATTESTATION_ID_IMEI = OH_HUKS_TAG_TYPE_BYTES | 507,
    /** MEID。 */
    OH_HUKS_TAG_ATTESTATION_ID_MEID = OH_HUKS_TAG_TYPE_BYTES | 508,
    /** 生产商。 */
    OH_HUKS_TAG_ATTESTATION_ID_MANUFACTURER = OH_HUKS_TAG_TYPE_BYTES | 509,
    /** 模型。 */
    OH_HUKS_TAG_ATTESTATION_ID_MODEL = OH_HUKS_TAG_TYPE_BYTES | 510,
    /** 别名。 */
    OH_HUKS_TAG_ATTESTATION_ID_ALIAS = OH_HUKS_TAG_TYPE_BYTES | 511,
    /** SOCID。 */
    OH_HUKS_TAG_ATTESTATION_ID_SOCID = OH_HUKS_TAG_TYPE_BYTES | 512,
    /** UDID。 */
    OH_HUKS_TAG_ATTESTATION_ID_UDID = OH_HUKS_TAG_TYPE_BYTES | 513,
    /** 安全等级信息。 */
    OH_HUKS_TAG_ATTESTATION_ID_SEC_LEVEL_INFO = OH_HUKS_TAG_TYPE_BYTES | 514,
    /** 版本信息。 */
    OH_HUKS_TAG_ATTESTATION_ID_VERSION_INFO = OH_HUKS_TAG_TYPE_BYTES | 515,

    /**
     * Other reserved TAG: 601 - 1000
     *
     * Extention TAG: 1001 - 9999
     */
    /** 是否密钥别名。 */
    OH_HUKS_TAG_IS_KEY_ALIAS = OH_HUKS_TAG_TYPE_BOOL | 1001,
    /** 密钥存储标记, 类型可在枚举OH_Huks_KeyStorageType选择。 */
    OH_HUKS_TAG_KEY_STORAGE_FLAG = OH_HUKS_TAG_TYPE_UINT | 1002,
    /** 是否运行打包数据。 */
    OH_HUKS_TAG_IS_ALLOWED_WRAP = OH_HUKS_TAG_TYPE_BOOL | 1003,
    /** 打包数据类型。 */
    OH_HUKS_TAG_KEY_WRAP_TYPE = OH_HUKS_TAG_TYPE_UINT | 1004,
    /** 密钥认证ID。 */
    OH_HUKS_TAG_KEY_AUTH_ID = OH_HUKS_TAG_TYPE_BYTES | 1005,
    /** 密钥作用。 */
    OH_HUKS_TAG_KEY_ROLE = OH_HUKS_TAG_TYPE_UINT | 1006,
    /** 密钥标记, , 类型可在枚举OH_Huks_KeyFlag选择。 */
    OH_HUKS_TAG_KEY_FLAG = OH_HUKS_TAG_TYPE_UINT | 1007,
    /** 是否异步。 */
    OH_HUKS_TAG_IS_ASYNCHRONIZED = OH_HUKS_TAG_TYPE_UINT | 1008,
    /** 安全密钥别名。 */
    OH_HUKS_TAG_SECURE_KEY_ALIAS = OH_HUKS_TAG_TYPE_BOOL | 1009,
    /** 安全密钥UUID。 */
    OH_HUKS_TAG_SECURE_KEY_UUID = OH_HUKS_TAG_TYPE_BYTES | 1010,
    /** 密钥领域。 */
    OH_HUKS_TAG_KEY_DOMAIN = OH_HUKS_TAG_TYPE_UINT | 1011,

    /** huks内部使用的标签值是从10001到10999 */
    /** 进程名。 */
    OH_HUKS_TAG_PROCESS_NAME = OH_HUKS_TAG_TYPE_BYTES | 10001,
    /** 数据包名。 */
    OH_HUKS_TAG_PACKAGE_NAME = OH_HUKS_TAG_TYPE_BYTES | 10002,
    /** 访问时间。 */
    OH_HUKS_TAG_ACCESS_TIME = OH_HUKS_TAG_TYPE_UINT | 10003,
    /** 使用时间。 */
    OH_HUKS_TAG_USES_TIME = OH_HUKS_TAG_TYPE_UINT | 10004,
    /** 密码算法的CTX。 */
    OH_HUKS_TAG_CRYPTO_CTX = OH_HUKS_TAG_TYPE_ULONG | 10005,
    /** 密钥数据。 */
    OH_HUKS_TAG_KEY = OH_HUKS_TAG_TYPE_BYTES | 10006,
    /** 密钥数据的版本。 */
    OH_HUKS_TAG_KEY_VERSION = OH_HUKS_TAG_TYPE_UINT | 10007,
    /** 负荷数据的长度。 */
    OH_HUKS_TAG_PAYLOAD_LEN = OH_HUKS_TAG_TYPE_UINT | 10008,
    /** AEAD。 */
    OH_HUKS_TAG_AE_TAG = OH_HUKS_TAG_TYPE_BYTES | 10009,
    /** 是否密钥的handle值。 */
    OH_HUKS_TAG_IS_KEY_HANDLE = OH_HUKS_TAG_TYPE_ULONG | 10010,

    /** os版本。 */
    OH_HUKS_TAG_OS_VERSION = OH_HUKS_TAG_TYPE_UINT | 10101,
    /** os补丁等级。 */
    OH_HUKS_TAG_OS_PATCHLEVEL = OH_HUKS_TAG_TYPE_UINT | 10102,

    /**
     * Reversed TAGs for SOTER: 11000 - 12000
     *
     * Other TAGs: 20001 - N
     * TAGs used for paramSetOut
     */
    /** 对称密钥数据 */
    OH_HUKS_TAG_SYMMETRIC_KEY_DATA = OH_HUKS_TAG_TYPE_BYTES | 20001,
    /** 非对称公钥数据。 */
    OH_HUKS_TAG_ASYMMETRIC_PUBLIC_KEY_DATA = OH_HUKS_TAG_TYPE_BYTES | 20002,
    /** 非对称私钥数据。 */
    OH_HUKS_TAG_ASYMMETRIC_PRIVATE_KEY_DATA = OH_HUKS_TAG_TYPE_BYTES | 20003,
};

/**
 * @brief 定义存放数据的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_Blob {
    /** 数据大小 */
    uint32_t size;
    /** 指向数据内存的指针 */
    uint8_t *data;
};

/**
 * @brief 定义参数集中的参数结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_Param {
    /** 标签值 */
    uint32_t tag;
/**
 * @brief 定义参数联合体。
 *
 * @since 8
 * @version 1.0
 */
    union {
        /** bool型参数。 */
        bool boolParam;
        /** int32_t型参数。 */
        int32_t int32Param;
        /** uint32_t型参数。 */
        uint32_t uint32Param;
        /** uint64_t型参数。 */
        uint64_t uint64Param;
        /** struct OH_Huks_Blob型参数。 */
        struct OH_Huks_Blob blob;
    };
};

/**
 * @brief 定义参数集的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_ParamSet {
    /** 参数集的内存大小。 */
    uint32_t paramSetSize;
    /** 参数的个数。*/
    uint32_t paramsCnt;
    /** 参数数组。*/
    struct OH_Huks_Param params[];
};

/**
 * @brief 定义证书链的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_CertChain {
    /** 指向证书数据的指针。 */
    struct OH_Huks_Blob *certs;
    /** 证书本数。 */
    uint32_t certsCount;
};

/**
 * @brief 定义密钥信息的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_KeyInfo {
    /** 密钥的别名。 */
    struct OH_Huks_Blob alias;
    /** 指向密钥参数集的指针。 */
    struct OH_Huks_ParamSet *paramSet;
};

/**
 * @brief 定义公钥信息的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_PubKeyInfo {
    /** 公钥的算法类型。 */
    enum OH_Huks_KeyAlg keyAlg;
    /** 公钥的长度。 */
    uint32_t keySize;
    /** n或X值的长度。 */
    uint32_t nOrXSize;
    /** e或Y值的长度。 */
    uint32_t eOrYSize;
    /** 占位符大小。 */
    uint32_t placeHolder;
};

/**
 * @brief 定义Rsa密钥的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_KeyMaterialRsa {
    /** 密钥的算法类型。 */
    enum OH_Huks_KeyAlg keyAlg;
    /** 密钥的长度。 */
    uint32_t keySize;
    /** n值的长度。 */
    uint32_t nSize;
    /** e值的长度。 */
    uint32_t eSize;
    /** d值的长度。 */
    uint32_t dSize;
};

/**
 * @brief 定义Ecc密钥的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_KeyMaterialEcc {
    /** 密钥的算法类型。 */
    enum OH_Huks_KeyAlg keyAlg;
    /** 密钥的长度。 */
    uint32_t keySize;
    /** x值的长度。 */
    uint32_t xSize;
    /** y值的长度。 */
    uint32_t ySize;
    /** z值的长度。 */
    uint32_t zSize;
};

/**
 * @brief 定义Dsa密钥的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_KeyMaterialDsa {
    /** 密钥的算法类型。 */
    enum OH_Huks_KeyAlg keyAlg;
    /** 密钥的长度。 */
    uint32_t keySize;
    /** x值的长度。 */
    uint32_t xSize;
    /** y值的长度。 */
    uint32_t ySize;
    /** p值的长度。 */
    uint32_t pSize;
    /** q值的长度。 */
    uint32_t qSize;
    /** g值的长度。 */
    uint32_t gSize;
};

/**
 * @brief 定义Dh密钥的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_KeyMaterialDh {
    /** 密钥的算法类型。 */
    enum OH_Huks_KeyAlg keyAlg;
    /** Dh密钥的长度。 */
    uint32_t keySize;
    /** 公钥的长度。 */
    uint32_t pubKeySize;
    /** 私钥的长度。 */
    uint32_t priKeySize;
    /** 保留。 */
    uint32_t reserved;
};

/**
 * @brief 定义25519类型密钥的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_KeyMaterial25519 {
    /** 密钥的算法类型。 */
    enum OH_Huks_KeyAlg keyAlg;
    /** 25519类型密钥的长度。 */
    uint32_t keySize;
    /** 公钥的长度。 */
    uint32_t pubKeySize;
    /** 私钥的长度。 */
    uint32_t priKeySize;
    /** 保留。 */
    uint32_t reserved;
};

#define OH_HUKS_DERIVE_DEFAULT_SALT_LEN 16
#define OH_HUKS_HMAC_DIGEST_SHA512_LEN 64
#define OH_HUKS_DEFAULT_RANDOM_LEN 16
#define OH_HUKS_MAX_KEY_AUTH_ID_LEN 64
#define OH_HUKS_KEY_MATERIAL_NUM 3
#define OH_HUKS_MAX_KEY_LEN ((((4096) + OH_HUKS_BITS_PER_BYTE - 1) / OH_HUKS_BITS_PER_BYTE) * OH_HUKS_KEY_MATERIAL_NUM)
#define OH_HUKS_MAX_KEY_MATERIAL_LEN (sizeof(struct OH_Huks_PubKeyInfo) + OH_HUKS_MAX_KEY_LEN + OH_HUKS_AE_TAG_LEN)

/**
 * @brief 定义存储区头部信息的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_StoreHeaderInfo {
    /** 版本号。 */
    uint16_t version;
    /** 存储的密钥数量。 */
    uint16_t keyCount;
    /** 存储的密钥总的内存大小。 */
    uint32_t totalLen;
    /** 存储的密封算法。 */
    uint32_t sealingAlg;
    /** 存储的盐值。 */
    uint8_t salt[OH_HUKS_DERIVE_DEFAULT_SALT_LEN];
    /** 存储的hmac摘要值。 */
    uint8_t hmac[OH_HUKS_HMAC_DIGEST_SHA512_LEN];
};

/**
 * @brief 定义存储密钥的信息的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_StoreKeyInfo {
    /** 当前密钥信息的内存大小。 */
    uint16_t keyInfoLen;
    /** 加密后的密钥长度。 */
    uint16_t keySize;
    /** 密钥的随机值。 */
    uint8_t random[OH_HUKS_DEFAULT_RANDOM_LEN];
    /** 标记是导入的密钥还是业务生成的密钥。 */
    uint8_t flag;        /* import or generate key */
    /** 密钥算法类型。 */
    uint8_t keyAlg;
    /** 密钥工作模式。 */
    uint8_t keyMode;
    /** 摘要算法。 */
    uint8_t digest;
    /** 数据填充方式。 */
    uint8_t padding;
    /** 保留。 */
    uint8_t rsv;
    /** 密钥长度，该值来源于输入参数集。 */
    uint16_t keyLen;
    /** 用途。 */
    uint32_t purpose;
    /** 作用。*/
    uint32_t role;
    /** 领域值。 */
    uint16_t domain;
    /** 密钥别名数据的长度。 */
    uint8_t aliasSize;
    /** 认证id的数据长度。 */
    uint8_t authIdSize;
};

/**
 * @brief 定义25519类型算法协商密钥对的结构体类型。
 *
 * @since 8
 * @version 1.0
 */
struct OH_Huks_25519KeyPair {
    /** 公钥占用内存的大小 */
    uint32_t publicBufferSize;
    /** 私钥占用内存的大小 */
    uint32_t privateBufferSize;
};

#ifdef __cplusplus
}
#endif

#endif /* NATIVE_OH_HUKS_TYPE_H */
